home *** CD-ROM | disk | FTP | other *** search
/ Chip 1996 April / CHIP 1996 aprilis (CD06).zip / CHIP_CD06.ISO / hypertxt.arj / 9509 / ART01.CD < prev    next >
Text File  |  1996-03-10  |  15KB  |  268 lines

  1.           @VPethô Ådám: Variációk assemblyre@N
  2.  
  3.           @VBemutatás, vagy valami efféle...@N
  4.  
  5.               Hosszú  szünet  után  jelent  meg  végre  a  PC assembly
  6.           programozásáról szóló könyvsorozatom 4., utolsó kötete.
  7.               Méretre,  súlyra,  a  tárgyalt  témakörök  számára nézve
  8.           egyaránt  tekintélyes  darab.  480  oldalas  terjedelme,  és
  9.           lemezmellékletének  összesen  1,8  Mbyte-nyi  példaprogramja
  10.           alapján  képet  alkothatunk   errôl.  Témája:  az   assembly
  11.           programozás,   száznál    is   több    gyakorlati   példával
  12.           megvilágítva.
  13.               A  választott   és  megoldott   feladatok  az   egyszerû
  14.           memóriafeltöltéssel  kezdôdnek,  és bejárva  a  konverzió, a
  15.           keresés és  rendezés egyes  szép tájait,  számos kitérô után
  16.           egy   soros   vonali   driverig   jutnak   (melyhez   persze
  17.           hardverinterrupt-kezelés, egy time-out  csomag és egy  C-ben
  18.           írt, mûködô  file-átviteli program  tartozik). Eközben  volt
  19.           idô  például   egy  ""hosszú   egészek  aritmetikája"   címû
  20.           csomagra, amely tetszôlegesen hosszú egészeket többek között
  21.           oszt  tetszôleges  hosszú  egészekkel;  szerepel  a könyvben
  22.           néhány ravasz stackelési varázslat, és sok más okosság.
  23.               A   könyv   írása  közben   három   alapvetô  gondolatot
  24.           igyekeztem  szem  elôtt  tartani.   Az  elsô,  hogy  azt   a
  25.           gondolatmenetet és érvrendszert is megkíséreljem  bemutatni,
  26.           amelynek alapján egy feladat számtalan lehetséges  megoldása
  27.           közül kiválasztjuk a legelônyösebbnek tûnôt. A második, hogy
  28.           a   megvalósítás    során   a    lehetô   legtrükkmentesebb,
  29.           biztonságos, precíz munkamódszer kialakítására törekedjek. A
  30.           harmadik pedig,  hogy vessük  alá az  elkészült rutinokat  a
  31.           lehetô legalaposabb tesztelésnek  -- ne csak  higgyük, hanem
  32.           lehetôleg bizonyítsuk is: az elkészült programok valóban azt
  33.           csinálják, amit állítunk róluk.
  34.               A  könyvet  tartalomjegyzék,  tárgymutató  és sörzáradék
  35.           teszi  teljessé.  Ez utóbbi  (saját  lelemény) a  következôt
  36.           tartalmazza:  minden  hiba elsô  felfedezôje  kap tôlem  egy
  37.           korsó (kitûnô minôségû) seritalt. Ha  más nem is, ez --  azt
  38.           hiszem  --  unikum  (persze nem  Unicum)  az  egyébként elég
  39.           száraz tematikájú könyvemben. A leggondosabb elôkészítés  és
  40.           tesztelés   dacára   a   sörmeghívás   nem   irreális:    az
  41.           utómunkálatok  során magam  is találtam  már több  mint  tíz
  42.           hibát  (ezekre  a  meghívás  természetesen  vonatkozik).   A
  43.           hibajelzéseket az 1615 Budapest, Pf. 217. címre, Pethô  Ådám
  44.           névre kérem.
  45.               A könyv egyébként  megvásárolható a ComputerTalum  Press
  46.           irodájában:  Budapest,  Váci  út  202.  III/328.,  tel./fax:
  47.           120-1636 (Szalay Zsóka).
  48.               Az alábbi írásban  éppen a tesztelés  véres küzdelmeibôl
  49.           mutatok be egy ""gyöngyszemet". A kiválasztott példa  kényes
  50.           kis feladat: a bináris keresés.
  51.  
  52.  
  53.           @VA tesztelésrôl általában@N
  54.  
  55.               A szakirodalom azt  írja, hogy a  programok tervezésekor
  56.           (és nem  utána) kell  megtervezni a  tesztelési eljárásokat.
  57.           Ezek sikeres végrehajtása  fogja majd igazolni,  hogy készen
  58.           vagyunk.  Nagyon fontos,  hogy a  konkrét programozás  elôtt
  59.           elkészüljön  az  összes   tesztprogram  és  a   teszteléshez
  60.           szükséges  adathalmaz.   A  programozás   ugyanis  fárasztó,
  61.           ugyanakkor felvillanyozó  tevékenység, s  ""befejezése" után
  62.           az  ember ritkán  van abban  az állapotban,  hogy  elszántan
  63.           kezdjen hozzá a teszteléshez, ráadásul a megvalósítás közben
  64.           általában   olyan   részletkérdésekkel   bíbelôdik,  amelyek
  65.           könnyen    elfedik   az    egyszerûbb   (és    veszélyesebb)
  66.           hibalehetôségeket.
  67.               Annak tehát,  hogy programozás  elôtt és  nem utána kell
  68.           megtervezni  a  tesztelést,  stratégiai  és  pszichikai okai
  69.           egyaránt  vannak.  A  tesztelés  tervezése  során  fel  kell
  70.           térképezni  minden  szóbajöhetô  esetet,  amelyen  a program
  71.           értelmesen  dolgozhat.  Ezen kívül  szükség  van különleges,
  72.           valamint   elfajuló   esetekre,  a   program   minden  egyes
  73.           bemenetére nézve. Ennyi a tesztelés elsô fázisa, amit  talán
  74.           minôségi  tesztnek  hívhatnánk.   Ezután  kerülhet  sor   az
  75.           úgynevezett (én  ""úgyneveztem" így)  mennyiségi tesztre.  A
  76.           minôségi   teszt   kevés,   de   nagyon   jól  megválogatott
  77.           tesztadaton történik -- ha  azonban várható, hogy a  program
  78.           sok  és  nagyméretû   objektumon  is  fog   dolgozni,  akkor
  79.           generálnunk   kell   olyan   teszt-adathalmazokat,   amelyek
  80.           megközelítik,  sôt,  meghaladják  azt  a  maximális méretet,
  81.           amelyen a  programnak emberi  számítás szerint  futnia kell.
  82.           Bizony,  a nagy  mennyiségek és  méretek váratlan  csapdákat
  83.           rejthetnek (betelnek bizonyos táblázatok, lemezek, szalagok;
  84.           túlcsordulnak  számlálók,  aritmetikai  változók  stb.).   A
  85.           mennyiségi  teszt  megtervezése  éppen  akkora   gondosságot
  86.           igényel, mint a minôségié.
  87.               Lehetôség  szerint   mindkét  teszthez   olyan  adatokat
  88.           válasszunk,  amelyek  jellemzôek,  de  amelyeknél viszonylag
  89.           könnyen   kiszámíthatjuk   a  helyes   eredményeket   --  és
  90.           ügyeljünk, nehogy speciális esetek és matematikai  törvények
  91.           elfedjék a hibákat stb.
  92.  
  93.  
  94.           @VA bináris keresésrôl@N
  95.  
  96.               Elôrebocsátom: elsô kísérletre bizony elböktem a  keresô
  97.           rutint.  Pszeudokódban  fogom csak  bemutatni  (nem szívesen
  98.           írnék   le   ide   példaprogram   gyanánt   hibásan   mûködô
  99.           változatot).
  100.               Az eljárás közismert: ha rendezett tömbben keresünk  egy
  101.           elemet, akkor ránézünk a halmaz közepére. Ha a keresett elem
  102.           nagyobb,  mint a  középsô, akkor  a tömb  felsô, ha  kisebb,
  103.           akkor pedig az alsó  felén folytatjuk ugyanezt a  mûveletet.
  104.           Mivel minden lépésben megfelezzük a tömböt, az eljárás véges
  105.           sok  lépésben  befejezôdik,  és  igen  gyorsan  megtalálja a
  106.           keresett elemet, illetve jelzi, hogy nincs benne a tömbben.
  107.               A hiba az volt, hogy ha a szorgos felezgetés közben  nem
  108.           találtam rá a keresett elemre, akkor -- mivel a pointer most
  109.           is  mutat valahová  -- még  ránéztem a  tömbre: nem  pont  a
  110.           pointer  végállásánál  van-e  a  keresett  elem.  Ez  súlyos
  111.           melléfogásnak  bizonyult, hiszen  amikor a  tömbhossz 0  (ez
  112.           jelzi a ciklus végét), akkor a változók üres tömböt  ""írnak
  113.           le".  Ekkor  pedig  már  semmiféle  mûveletnek  nincs helye,
  114.           legkevésbé egy ilyen ""sicher was sure" odapislantásnak.
  115.               Lássuk   a   saját  magam   által   kialakított  stílusú
  116.           pszeudokódban a keresés vázlatát (a hibás változatot):
  117.  
  118.           Bináris  keresési  eljárás  kezdôcím  és hossz alapján
  119.           Bemenet
  120.              pnt a tömb kezdôcíme
  121.              size a tömb hossza (elemszáma)
  122.              val a keresendô érték
  123.           Kimenet:
  124.              addr a megtalált elem címe
  125.              index a megtalált elem indexe
  126.                 vagy
  127.              hibajelzés (ha a keresett érték nincs a tömbben)
  128.           Munkaváltozó:
  129.              wpnt mindig a vizsgált tömb kezdôcímét tartalmazza
  130.              wsize mindig a vizsgált tömb hosszát tartalmazza
  131.  
  132.           Elôkészítés:
  133.              wpnt = pnt
  134.              wsize = size
  135.           Ciklus:
  136.              ha wsize = 0 (a tömb elfogyott) [átgondolatlan pont]
  137.                 ha wpnt[ 0 ] = val (megvan)
  138.                    addr = wpnt
  139.                    index = addr - wpnt
  140.                 különben (nincs a tömbben)
  141.                    addr = 0
  142.                    index = 0
  143.                    hibajelzés
  144.                 vége;
  145.              ha wpnt[ wsize/2 ] = val (megvan)
  146.                 addr = wpnt + wsize/2
  147.                 index = addr - pnt
  148.                 vége;
  149.              ha wpnt[ size/2 ] > val (alsó felén folytatjuk)
  150.                 wsize = wsize/2
  151.                 Ciklus-sal folytatjuk;
  152.              ha wpnt[ size/2 ] < val (felsô felén folytatjuk)
  153.                 wpnt = wpnt + wsize/2 + 1
  154.                 wsize = wsize - wsize/2 - 1
  155.              Ciklus-sal folytatjuk;
  156.  
  157.               A szögletes  zárójelek között  külön kommentezett  sor a
  158.           bûnös, de lássuk, hogy miben.
  159.  
  160.  
  161.           @VTesztstratégia a bináris kereséshez@N
  162.  
  163.               Gondoljuk   végig    a   bináris    keresés   tesztelési
  164.           stratégiáját!  (Ezt  követtem akkor  is,  amikor egy  kedves
  165.           barátomnak   mutattam    a   példaprogramot,    s   miközben
  166.           magyaráztam, hogy mindez miért is olyan nagyszerû,  kishíján
  167.           hanyattestem, mikor egy elfajuló esetet pozitív  eredménnyel
  168.           zárt a rutin...)
  169.               Elsôként vegyük a közönséges eseteket. Ehhez veszünk egy
  170.           rendezett  tömböt,  melyben  elôfordul  többszörös  érték is
  171.           (nehogy kihasználjuk  véletlenül, hogy  az elemek  szigorúan
  172.           monoton növekvôek).  Ezek után  elôször keressünk  a tömbben
  173.           szereplô értékeket: a legelsô, több belsô (közöttük többször
  174.           szereplô) és az utolsó (legnagyobb) elem értékét!
  175.               A  következô  lépés  ugyanerre a  tömbre  a  tömbben nem
  176.           szereplô értéket keresni: kisebbet, mint a tömb elsô  eleme,
  177.           az elsô  és a  második közé  esôt, két  belsô tömbelem  közé
  178.           esôt, az utolsó elôtti és az utolsó közé esôt, végül  olyat,
  179.           ami nagyobb az utolsónál is.
  180.               Ezután  speciális  eseteket  vizsgálunk:  olyan  tömböt,
  181.           amelynek összes értéke azonos; ne mulasszuk el egyelemû tömb
  182.           vizsgálatát  sem!  Végül  egy elfajuló  esetet  is  meg kell
  183.           vizsgálni: az üres tömböt, amelynek elemszáma 0.
  184.               Maga a keresendô elem,  mint egyszerû számérték (ti.  az
  185.           egészek  körében)  nem tartogathat  semmi  meglepetést, erre
  186.           tehát nem kell esetszétválasztásokat végeznünk.
  187.               Lássuk az adathalmazt!
  188.  
  189.               DATA SEGMENT PARA PUBLIC 'DATA' ;
  190.                          ;
  191.               ARRAY1 DW 1, 3, 3, 6, 9, 11, 52, 86
  192.               ARRAY1_SIZE EQU ( $ - ARRAY1 ) / TYPE ARRAY1
  193.                          ;
  194.                 ;Speciális eset '1: konstans tömb
  195.               ARRAY2 DW 4, 4, 4, 4 ;
  196.               ARRAY2_SIZE EQU ( $ - ARRAY2 ) / TYPE ARRAY2
  197.                          ;
  198.                 ;Speciális eset '2: egyelemû tömb
  199.               ARRAY3 DW 5 ;
  200.               ARRAY3_SIZE EQU ( $ - ARRAY3 ) / TYPE ARRAY3
  201.                          ;
  202.                 ;Elfajuló eset: üres tömb
  203.               ARRAY4 LABEL WORD ;
  204.               ARRAY4_SIZE EQU 0 ;
  205.                          ;
  206.               DATA ENDS ;
  207.  
  208.               A fenti négy tömb lefedi a minôségi teszt közönséges  és
  209.           speciális eseteit. A rutin tesztelésekor az alábbi értékeket
  210.           használtam, mint keresendô értékeket:
  211.               (1) az ARRAY1 tömbben kerestem az 1, 3, 6, 11, 52 és 86,
  212.           valamint a -5 értékeket  (hátha negatívra nem jól  mûködik),
  213.           majd a 0, 2, 5, 10, 80 és 90 értékeket;
  214.               (2) az ARRAY2 tömbben kerestem a 3, 4 és 5 értékeket;
  215.               (3) az ARRAY3 ""tömbben" kerestem a 4, 5 és 6 értékeket;
  216.               (4) végül  az ARRAY4  elfajuló ""tömbben"  (ami még csak
  217.           nem  is  létezett)  kerestem  egy  tetszôleges  értéket   --
  218.           konkrétan a 8-at.
  219.               A  mennyiségi  teszt   ezúttal  elhagyható.  A   bináris
  220.           keresést végrehajtó eljárás megírásakor csak annyit  tettünk
  221.           fel, hogy a tömb nem haladja meg a szegmensnyi méretet, és a
  222.           végigcímezhetô DS  szegmensregiszter bemenetkori  állásával.
  223.           Ha  nem így  van, a  rutin nyilvánvalóan  hibázik, ha  pedig
  224.           teljesül, akkor nem játszik szerepet a tömb mérete, sem a rá
  225.           mutató pointerek értéke.
  226.  
  227.  
  228.           @VAz eredmény@N
  229.  
  230.               Nos,  amikor  elkészültem  a  tesztelési   stratégiával,
  231.           nagyon  meg  voltam  elégedve  magammal.  Igazán  figyelembe
  232.           vettem  minden  számottevô  esetet,  és  jól   áttekinthetô,
  233.           ugyanakkor egyszerû tesztadatokat hoztam létre.
  234.               Ezt  hívén,  igazán meglepett,  hogy  az ARRAY2  tömbben
  235.           (amely csupa  4 értékbôl  áll), a  rutin szívfájdalom nélkül
  236.           megtalálta az 5 értéket.
  237.               Ez annak volt köszönhetô, hogy végiglépegetve-felezgetve
  238.           a rendelkezésre álló címtartományt, a munkapointer szorgosan
  239.           lépkedett  felfelé,  és   olyan  szerencsétlenül  álltak   a
  240.           csillagok, hogy a kilépéskor a pointerben maradt szemét  már
  241.           a tömbön kívülre mutatott. A tétován az eljárás után küldött
  242.           utolsó ellenôrzés tehát már nem a tömb területét  vizsgálta.
  243.           Ekkor  következett   programozói  pályám   egyik  legnagyobb
  244.           mázlija: ott, ahová a pointer nézett, éppen a keresett, és a
  245.           tömbben  nem található  5 érték  volt a  tárban. Nagyon  sok
  246.           mindennek kellett ehhez így együtt állnia (például a fizikai
  247.           tárcímeknek...).  Ha  ez  az  elképesztô  szerencse  nem jön
  248.           segítségemre, akkor bizony abban a hitben élnék, hogy a fent
  249.           bemutatott pszeudokód helyes.
  250.  
  251.  
  252.           @VMi ebbôl a tanulság?@N
  253.  
  254.               ""Abszolúte semmi". Talán az, hogy szép lehetsz, de okos
  255.           nem. Akárkinek  meséltem el  a tesztstratégiát,  azt mondta:
  256.           olyan,  ahogyan  a  nagykönyvben  meg  van  írva.   Mindenre
  257.           gondoltam  --  és  a  vak  véletlen  mentett  meg  egy kínos
  258.           hibától.
  259.               Végeredményben: ha átkozunk egy szoftvert, mert tele van
  260.           hibával,  gondoljunk  az  efféle  esetekre  is.  A tesztelés
  261.           részben szakma, részben  mûvészet. Nyilván mindenki  mindent
  262.           megtesz,  de ha  egy hatalmas  programrendszer minden  egyes
  263.           rutinja  efféle  csapdákat  rejteget,  akkor  tôlünk,   akik
  264.           nemcsak  felhasználók,  de  talán  fejlesztôk  is   vagyunk,
  265.           várható némi megértés.
  266.  
  267.           @KPethô Ådám@N
  268.